clc;clear;close all;
%{
神经网络训练主程序 written by GSX.
流程：
训练参数设置（在NARXConfig.txt文件中）——
数据读取——
设置神经网络的输入输出——
在narx_explanation.m中设置输入序列和输出序列的名称——
在result文件夹中查看结果。
%}
[outputSetting,param]=configInput('NARXConfig.txt');  %导入训练设置

%% 数据读取
addpath('./NARX');
load mdm.mat
date=time;    % 可视化的日期，1996年1月1日0点是262969个数据，目前试图用前三十年数据训练网络，然后预测后二十年水位并进行比较
% 1976年1月1日是87649个数据
t=t;    %日期序列数
makou_Q=q(:);
sanzao_z=z(:,1);
denglongshan_z=z(:,2);
zhuyin_z=z(:,3);
ganzhu_z=z(:,4);
makou_z=z(:,5);

%% 读取导入的训练设置
% 生成图片对应的训练参数文档说明
NARX_explanation(outputSetting,param);

for i=1:param.trainCount
    if outputSetting.isDate==1
        param=param.date_to_index(t);  %将日期转化为索引
    end
    trainBegin=param.trainBegin{i};       %用于训练的数据的开始索引
    trainEnd=param.trainEnd{i};      %用于训练的数据的结束索引
    predictBegin=param.predictBegin{i};       %用于预测的数据的开始索引
    predictEnd=param.predictEnd{i};      %用于预测的数据的结束索引
    if trainBegin==0
        continuePredict=1;   %是否使用上一次的训练结果预测这一次输入
    else
        continuePredict=0;
    end
    % 神经网络部分设置
    inputDelays = param.inputDelays{i};    %输入延迟
    feedbackDelays = param.feedbackDelays{i};    %输出延迟
    hiddenLayerSize = param.hiddenLayerSize{i};    %隐藏层神经元数
    
    
    %% 设置神经网络的输入输出
    if continuePredict==0
        makou_Q_train=q(trainBegin:trainEnd);
        sanzao_z_train=z(trainBegin:trainEnd,1);
        denglongshan_z_train=z(trainBegin:trainEnd,2);
        zhuyin_z_train=z(trainBegin:trainEnd,3);
        ganzhu_z_train=z(trainBegin:trainEnd,4);
        makou_z_train=z(trainBegin:trainEnd,5);
    end
    makou_Q_predict=q(predictBegin:predictEnd);
    sanzao_z_predict=z(predictBegin:predictEnd,1);
    denglongshan_z_predict=z(predictBegin:predictEnd,2);
    zhuyin_z_predict=z(predictBegin:predictEnd,3);
    ganzhu_z_predict=z(predictBegin:predictEnd,4);
    makou_z_predict=z(predictBegin:predictEnd,5);
    
    % 输入和目标序列设置
    inputTrain=makou_Q_train;   %输入的训练用时间序列
    targetTrain=makou_z_train;   %目标训练时间序列
    inputPredict=makou_Q_predict;   %输入的预测时间序列
    targetPredict=makou_z_predict;   %目标预测时间序列
    
    %% 以上述参数训练NARX神经网络
    output=NARX_predict_gsx(outputSetting,i, ...
        inputTrain,targetTrain,inputPredict,targetPredict, ...
        inputDelays,feedbackDelays,hiddenLayerSize,continuePredict);
    % 绘制结果并保存
    NARX_plot_CEEMDAN(outputSetting,inputDelays,output,targetPredict,num2str(i));
    
end
